package com.ian.offer;

/**
 * @author zhangyaowen
 * @date 2021/3/8 10:01 下午
 */

import java.util.Arrays;

/**
 * 输入一个矩阵，按照从外向里以顺时针的顺序依次打印出每一个数字。
 * <p>
 *  
 * <p>
 * 示例 1：
 * <p>
 * 输入：matrix = [[1,2,3],[4,5,6],[7,8,9]]
 * 输出：[1,2,3,6,9,8,7,4,5]
 * 示例 2：
 * <p>
 * 输入：matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
 * 输出：[1,2,3,4,8,12,11,10,9,5,6,7]
 *  
 * <p>
 * 限制：
 * <p>
 * 0 <= matrix.length <= 100
 * 0 <= matrix[i].length <= 100
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/shun-shi-zhen-da-yin-ju-zhen-lcof
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class SpiralOrder {

    public int[] spiralOrder(int[][] matrix) {

        if (matrix.length == 0 || matrix[0].length == 0) {
            return new int[]{};
        }


        int right  = matrix[0].length - 1;
        int bom = matrix.length - 1;
        int top = 0;
        int left = 0;

        int[] r = new int[matrix.length * matrix[0].length];
        int idx = 0;
        while(left <=right && top <= bom){
            for (int column = left; column <= right; column++) {
                r[idx++] = matrix[top][column];
            }
            for (int row = top + 1; row <= bom; row++) {
                r[idx++] = matrix[row][right];
            }
            if (left < right && top < bom) {
                for (int column = right - 1; column > left; column--) {
                    r[idx++] = matrix[bom][column];
                }
                for (int row = bom; row > top; row--) {
                    r[idx++] = matrix[row][left];
                }
            }
            left++;
            right--;
            top++;
            bom--;
            
            
        }

        return r;
    }

    public static void main(String[] args) {
        SpiralOrder s = new SpiralOrder();


        int[][] matrix = {{1, 2, 3,4}, { 5, 6,7,8}, {9,10,11,12}};


       // int[][] matrix =   {{1,2,3},{4,5,6},{7,8,9}};
        System.out.println(Arrays.toString(s.spiralOrder(matrix)));
    }
}
